Introducción

En esta práctica vamos a trabajar con una muestra de la base de datos Puntaje Crediticio, y podemos consultar el contexto de dichos datos haciendo clic en este enlace.

¿Qué aprenderemos?

Instalamos paquetes

# Paquetes para hacer resúmenes de conjuntos de datos
# install.packages("summarytools")
# install.packages("skimr")

# Paquete para estimar la moda de un vector univariado
# install.packages("modeest")

# Paquete para hacer diversas gráficas
# install.packages("ggpubr")

Importar paquetes y datos

## Cargamos librerías
library("tidyverse")
library("skimr")
library("summarytools")
library("modeest")
library("ggpubr")

## Lectura
library("readxl")
read_xlsx(
  path = "data/Puntaje-Crediticio.xlsx", 
  sheet= "DB"
) -> data_raw

## Revisar la estructura de los datos
str(data_raw)

## Transformamos el ID como una variable tipo char
data_raw$ID <- as.character(data_raw$ID)

## Convertimos variables respectivas a factores
factores <- c("Gender", "Has a car", "Has a property", "Employment status", 
              "Education level", "Marital status", "Dwelling", "Has a mobile phone", "Has a work phone", 
              "Has a phone", "Has an email", "Job title", "Is high risk")
data_raw %>% mutate_at(factores,factor) -> data

## Revisamos que la estructura de los datos esté ajustada
str(data)

## Advertencia:
## Una vez la estructura está ajustada hay que hacer limpieza de datos
## Vamos a seguir el procesamiento con fines pedagógicos

Estadísticos descriptivos frecuentes

# Univariados
mean() # para la media
median() #para la mediana
modeest::mfv() # para la moda
var() # para la varianza
sd() # para la desviación estándar
max() # para el máximo
min() # para el mínimo
quantile() # para los cuartiles
IQR() # para el rango intercuartílico
# Multivariados
cov() # para la covarianza
cor() # para la correlación
table() # para tablas de contingencia - también sirve en una variable

Ejemplo: estadísticos descriptivos para la variable income (cuantitativa)

mean(data$Income)
## [1] 185867.2
median(data$Income)
## [1] 157500
var(data$Income)
## [1] 10670152781
sd(data$Income)
## [1] 103296.4
max(data$Income)
## [1] 1575000
min(data$Income)
## [1] 27000
quantile(data$Income)
##      0%     25%     50%     75%    100% 
##   27000  117000  157500  225000 1575000
IQR(data$Income)
## [1] 108000

Ejemplo: estadísticos descriptivos para la variable RAD (cualitativa)

# Moda
mfv(data$`Education level`)
## [1] Secondary / secondary special
## 5 Levels: Academic degree Higher education ... Secondary / secondary special
# Frecuencias absolutas (Conteos)
table(data$`Education level`)
## 
##               Academic degree              Higher education 
##                             7                          1954 
##             Incomplete higher               Lower secondary 
##                           281                            76 
## Secondary / secondary special 
##                          4974
# Frecuencias relativas (Proporciones) 
prop.table(table(data$`Education level`))
## 
##               Academic degree              Higher education 
##                  0.0009599561                  0.2679648930 
##             Incomplete higher               Lower secondary 
##                  0.0385353812                  0.0104223807 
## Secondary / secondary special 
##                  0.6821173889

Un método útil integrado en R: summary()

## Resumen para una sola variable
summary(data$Income)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   27000  117000  157500  185867  225000 1575000
## Resumen para todo el conjunto de datos
summary(data)
##       ID            Gender   Has a car Has a property Children count   
##  Length:7292        F:4881   0:4486    0:2343         Min.   : 0.0000  
##  Class :character   M:2411   1:2806    1:4949         1st Qu.: 0.0000  
##  Mode  :character                                     Median : 0.0000  
##                                                       Mean   : 0.4284  
##                                                       3rd Qu.: 1.0000  
##                                                       Max.   :14.0000  
##                                                                        
##      Income                   Employment status
##  Min.   :  27000   Commercial associate:1689   
##  1st Qu.: 117000   Pensioner           :1232   
##  Median : 157500   State servant       : 604   
##  Mean   : 185867   Student             :   4   
##  3rd Qu.: 225000   Working             :3763   
##  Max.   :1575000                               
##                                                
##                       Education level              Marital status
##  Academic degree              :   7   Civil marriage      : 633  
##  Higher education             :1954   Married             :5004  
##  Incomplete higher            : 281   Separated           : 391  
##  Lower secondary              :  76   Single / not married: 965  
##  Secondary / secondary special:4974   Widow               : 299  
##                                                                  
##                                                                  
##                 Dwelling    Has a mobile phone Has a work phone Has a phone
##  Co-op apartment    :  41   1:7292             0:5612           0:5147     
##  House / apartment  :6489                      1:1680           1:2145     
##  Municipal apartment: 216                                                  
##  Office apartment   :  54                                                  
##  Rented apartment   : 122                                                  
##  With parents       : 370                                                  
##                                                                            
##  Has an email       Job title    Family member count  Account age   
##  0:6654       Laborers   :1207   Min.   : 1.000      Min.   : 0.00  
##  1: 638       Core staff : 725   1st Qu.: 2.000      1st Qu.:12.00  
##               Sales staff: 712   Median : 2.000      Median :24.00  
##               Managers   : 590   Mean   : 2.202      Mean   :26.27  
##               Drivers    : 416   3rd Qu.: 3.000      3rd Qu.:39.00  
##               (Other)    :1346   Max.   :15.000      Max.   :60.00  
##               NA's       :2296                                      
##  Is high risk
##  0:7175      
##  1: 117      
##              
##              
##              
##              
## 

Normalmente estas funciones no trabajan si encuentran datos perdidos, para eliminar esta restricción se usa

na.rm = TRUE

## Cálculo del promedio omitiendo datos perdidos/faltantes
mean(data$Income, na.rm = TRUE)

Otros métodos de resumen útiles

# Resumen usando el paquete skimr
skim(data)
Data summary
Name data
Number of rows 7292
Number of columns 18
_______________________
Column type frequency:
character 1
factor 13
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
ID 0 1 7 7 0 7292 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
Gender 0 1.00 FALSE 2 F: 4881, M: 2411
Has a car 0 1.00 FALSE 2 0: 4486, 1: 2806
Has a property 0 1.00 FALSE 2 1: 4949, 0: 2343
Employment status 0 1.00 FALSE 5 Wor: 3763, Com: 1689, Pen: 1232, Sta: 604
Education level 0 1.00 FALSE 5 Sec: 4974, Hig: 1954, Inc: 281, Low: 76
Marital status 0 1.00 FALSE 5 Mar: 5004, Sin: 965, Civ: 633, Sep: 391
Dwelling 0 1.00 FALSE 6 Hou: 6489, Wit: 370, Mun: 216, Ren: 122
Has a mobile phone 0 1.00 FALSE 1 1: 7292
Has a work phone 0 1.00 FALSE 2 0: 5612, 1: 1680
Has a phone 0 1.00 FALSE 2 0: 5147, 1: 2145
Has an email 0 1.00 FALSE 2 0: 6654, 1: 638
Job title 2296 0.69 FALSE 18 Lab: 1207, Cor: 725, Sal: 712, Man: 590
Is high risk 0 1.00 FALSE 2 0: 7175, 1: 117

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Children count 0 1 0.43 0.74 0 0 0 1 14 ▇▁▁▁▁
Income 0 1 185867.23 103296.43 27000 117000 157500 225000 1575000 ▇▁▁▁▁
Family member count 0 1 2.20 0.91 1 2 2 3 15 ▇▁▁▁▁
Account age 0 1 26.27 16.56 0 12 24 39 60 ▇▇▆▅▃
# Resumen usando el paquete summarytools
summarytools::descr(data)
## Descriptive Statistics  
## data  
## N: 7292  
## 
##                     Account age   Children count   Family member count       Income
## ----------------- ------------- ---------------- --------------------- ------------
##              Mean         26.27             0.43                  2.20    185867.23
##           Std.Dev         16.56             0.74                  0.91    103296.43
##               Min          0.00             0.00                  1.00     27000.00
##                Q1         12.00             0.00                  2.00    117000.00
##            Median         24.00             0.00                  2.00    157500.00
##                Q3         39.00             1.00                  3.00    225000.00
##               Max         60.00            14.00                 15.00   1575000.00
##               MAD         20.76             0.00                  0.00     66717.00
##               IQR         27.00             1.00                  1.00    108000.00
##                CV          0.63             1.74                  0.41         0.56
##          Skewness          0.28             2.48                  1.25         2.67
##       SE.Skewness          0.03             0.03                  0.03         0.03
##          Kurtosis         -1.05            17.68                  6.34        15.01
##           N.Valid       7292.00          7292.00               7292.00      7292.00
##         Pct.Valid        100.00           100.00                100.00       100.00

Gráficas básicas

Diagrama de puntos

Presenta los valores de una variable para cada observación usando símbolos, y cada observación se grafica de manera relativa al número de la observación.

plot(data$Income)

Histogramas

Es un tipo de gráfica de barras que muestra conteos o frecuencias relativas de valores que caen en diferentes intervalos.

hist(data$Income)

Podemos cambiar el número de barras usando el parámetro breaks

hist(data$Income, breaks=20)

Gráficos de densidad (también llamados gráficas Kernel o histogramas suavizados)

Muestra las frecuencias relativas locales de los puntos a lo largo del eje X. En otras palabras, en los intervalos donde hay más puntos/observaciones la gráfica crece indicando mayor “densidad”.

plot(density(data$Income))

Los gráficos de densidad son muy útiles para determinar la función de distribución de probabilidad de una variable cuantitativa.

Gráfico Q-Q

Se usa para revisar si los datos siguen una distribución aproximadamente normal.

ggqqplot(data, x = "Income")

Función de distribución empírica acumulada

Muestra la frecuencia relativa acumulada para los valores de la muestra.

ggecdf(data, x = "Income")

Boxplot

Muestra la ubicación, dispersión y distribución de una variable mediante la construcción de una figura en forma de caja con un conjunto de líneas (bigotes) que se extienden desde los extremos de la caja. Los bordes del cuadro se dibujan en los percentiles 25 y 75 de los datos, y una línea en el medio del cuadro marca el percentil 50.

boxplot(data$Income)

Nota: en ciencia de datos cuando las variables de la base de datos son cuantitativas se les suele llamar variables contínuas, y en estos casos los tipos de gráficos que más se usan son los histogramas y los boxplots. Para variables cualitativas, a las que se le suele llamar variables categóricas, estas usualmente se representan mediante tablas de contingencia, diagramas de barras o diagramas de torta.

Diagrama de barras

# Sin orden
ggplot(data, aes(x = Dwelling))+
  geom_bar(stat="count")+
  theme_minimal()

# Ordenado
# Función para reordenar los factores de un vector en orden decreciente
reorder_size <- function(x) {
        factor(x, levels = names(sort(table(x), decreasing = TRUE)))
}
ggplot(data, aes(x = reorder_size(Dwelling)))+
  geom_bar(stat="count")+
  theme_minimal()

Gráficos bivariados y multivariados

Ejemplo: diagrama de dispersión entre dos variables contínuas

plot(data$`Family member count`, data$`Children count`)

Ejemplo: boxplot por grupos (una variable contínua y una categórica)

ggboxplot(data, x = "Gender", y = "Income",
          palette = c("#00AFBB", "#E7B800"))

Ejemplo: matríz de correlación gráfica

library("corrplot")
variables_seleccionadas <- c("Income","Family member count","Account age","Children count")
data[variables_seleccionadas] -> variables_numericas
variables_numericas %>% 
  cor %>% 
  corrplot.mixed(lower = "number", upper = "color", lower.col = "#aaaaaa", number.cex = 0.6, tl.cex = 0.6)

Una librería útil con una interfaz para hacer gráficas: esquisse

## Instalamos la librería
# install.packages("esquisse")

## Cargamos la librería
# library("esquisse")

## Llamamos a la función esquisser especificando con cuales datos queremos trabajar
# esquisser(data = data, viewer = "browser")

Gráficos profesionales